/**********************************************************************//**
            Meteor Firmware Platform
              
*-
@file   main.c
@author Lucas
@date   2021/04/28 13:16:38
@brief  main module
**************************************************************************/
#include <stdio.h>
// NOTE:
// include 的本质即是一种符号，编译器将对应的符号替换为相应的文件内容
// include .c 文件不推荐使用，会暴露.c内部的一些私有成员（函数或者static变量），不符合模块化的思想
// 对比之下.h文件的功能则是提供一种访问对应.c文件的公开（public）接口，故.h文件中更多的存在的是函数的“声明”而非定义
// .c 文件中存在的则是函数的“定义”
#include "bubble.c"
#include "selection.c"
#include "insertion.c"
#include "shell.c"

int main()
{
    
    // do not need set array size,cause compiler will calculate it ! 
    int data_arr[] = {3,5,1,-7,4,9,-6,8,10,4};

    // sizeof operation happen/excute in pre-compile,
    // so this macro make update data_arr easy,do not need to care change the array len  
    // Q1:  编译器如何在预编译阶段计算栈（stack）里面的大小的？
    #define DATA_LEN (sizeof(data_arr)/sizeof(int))

    // excute bubble sort
    printf("bubble\r\n");
    bubble_sort(data_arr,DATA_LEN,1);
    bubble_sort(data_arr,DATA_LEN,0);

    // excute bubble sort
    printf("\r\nselection\r\n");
    selection_sort(data_arr,DATA_LEN,1);
    selection_sort(data_arr,DATA_LEN,0);


    // excute insertion sort
    printf("\r\ninsertion\r\n");
    insertion_sort(data_arr,DATA_LEN);

    // excute insertion sort
    printf("\r\nshell\r\n");
    shell_sort(data_arr,DATA_LEN);
    #undef DATA_LEN

    return 0;
}
